﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace ApplicationGenerator.CommonModule
{
    /// <summary>
    /// Klasa pomocniczna do pracy z web serwisami
    /// </summary>
    public class WebServiceUtility
    {
        /// <summary>
        /// Adres URL web serwisu
        /// </summary>
        private string _webServiceUrl;

        /// <summary>
        /// Komunikat błędu
        /// </summary>
        public string Error
        {
            get;
            private set;
        }

        /// <summary>
        /// Konstruktor
        /// </summary>
        /// <param name="webServiceUrl">Adres URL web serwisu</param>
        public WebServiceUtility(string webServiceUrl)
        {
            _webServiceUrl = webServiceUrl;
        }

        /// <summary>
        /// Sprawdza, czy dany adres URL istnieje już w pliku konfiguracyjnym
        /// </summary>
        /// <returns>Czy dany adres URL istnieje już w pliku konfiguracyjnym ?</returns>
        public bool IsWebServiceUrlDefined()
        {
            return WebServiceConfigurationHelper.Contains(_webServiceUrl);
        }

        /// <summary>
        /// Sprawdza, czy adres URL jest prawidłowy
        /// </summary>
        /// <returns>Czy adres URL jest prawidłowy ?</returns>
        public bool IsWebServiceUrlCorrectlyFormed()
        {
            if (string.IsNullOrEmpty(_webServiceUrl))
            {
                Error = "Adres URL nie może być pusty";
                return false;
            }

            try
            {
                new Uri(_webServiceUrl);
            }
            catch (Exception ex)
            {
                Error = string.Format("Błędnie sformułowany adres URL: {0}", ex.Message);
                return false;
            }

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_webServiceUrl);
            HttpWebResponse response = null;
            try
            {
                response = (HttpWebResponse)request.GetResponse();
            }
            catch (Exception ex)
            {
                Error = string.Format("Błąd odpowiedzi serwera: {0}", ex.Message);
                return false;
            }
            if (response.StatusCode != HttpStatusCode.OK)
            {
                Error = string.Format("Adres {0} jest nieosiągalny", _webServiceUrl);
                return false;
            }

            return true;
        }

        /// <summary>
        /// Generuje klienta do web serwisu, kompiluje go oraz tworzy oraz wpis do konfiguracji
        /// </summary>
        public void GenerateAssembly()
        {
            string destinationFileName = Guid.NewGuid().ToString();
            string generatedWsdlFileName = string.Format("{0}.cs", destinationFileName);
            string generatedAssemblyFileName = string.Format("{0}.dll", destinationFileName);

            WSDLUtility wsdl = new WSDLUtility();
            if (!wsdl.GenerateWebServiceClient(_webServiceUrl, Path.Combine(ProjectConfiguration.GetWebServicesAssembliesPath(), generatedWsdlFileName)))
            {
                throw new Exception("Błąd w trakcie generowania klienta do web serwisu");
            }

            ClassCompilerUtility compiler = new ClassCompilerUtility();
            if (!compiler.Compile(
                Path.Combine(ProjectConfiguration.GetWebServicesAssembliesPath(), generatedWsdlFileName),
                Path.Combine(ProjectConfiguration.GetWebServicesAssembliesPath(), generatedAssemblyFileName)))
            {
                throw new Exception("Błędy w trakcie kompilacji klienta do web serwisu");
            }

            WebServiceConfigurationHelper.AddToFile(_webServiceUrl, generatedAssemblyFileName);
        }

        /// <summary>
        /// Pobiera ścieżkę do wygenerowanego pliku klienta do web serwisu
        /// </summary>
        /// <returns>Ścieżka do wygenerowanego pliku klienta do web serwisu</returns>
        public string GetWebServiceAssemblyPath()
        {
            if (!IsWebServiceUrlDefined())
            {
                return null;
            }

            return WebServiceConfigurationHelper.GetPath(_webServiceUrl);

        }
    }
}
